mat3 inverseMat3(mat3 m) {
    float det = m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) - m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) + m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);

    // 防止除以接近 0 的行列式，给一个兜底值，避免 NaN
    float eps = 1e-6;
    if (abs(det) < eps) {
        return mat3(1.0); // 回退为单位矩阵，避免破坏法线
    }

    float invDet = 1.0 / det;

    mat3 adj; // 伴随矩阵（ cofactors 的转置）
    adj[0][0] =  (m[1][1] * m[2][2] - m[1][2] * m[2][1]);
    adj[0][1] = -(m[0][1] * m[2][2] - m[0][2] * m[2][1]);
    adj[0][2] =  (m[0][1] * m[1][2] - m[0][2] * m[1][1]);

    adj[1][0] = -(m[1][0] * m[2][2] - m[1][2] * m[2][0]);
    adj[1][1] =  (m[0][0] * m[2][2] - m[0][2] * m[2][0]);
    adj[1][2] = -(m[0][0] * m[1][2] - m[0][2] * m[1][0]);

    adj[2][0] =  (m[1][0] * m[2][1] - m[1][1] * m[2][0]);
    adj[2][1] = -(m[0][0] * m[2][1] - m[0][1] * m[2][0]);
    adj[2][2] =  (m[0][0] * m[1][1] - m[0][1] * m[1][0]);

    return adj * invDet;
}